'''
1. paramiko介绍

  ssh是一个协议，OpenSSH是其中一个开源实现，paramiko是Python的一个库，实现了SSHv2协议(底层使用cryptography)。
  有了Paramiko以后，我们就可以在Python代码中直接使用SSH协议对远程服务器执行操作，而不是通过ssh命令对远程服务器进行操作。

paramiko属于第三方库，所以需要使用如下命令现行安装
pip install paramiko
  paramiko包含了两个核心组件：SSHClient 和 SFTPClient

SSHClient的作用类似于Linux的ssh命令，是对SSH会话的封装，该类封装了传输(Transport)，通道(Channel)及SFTPClient建立的方法(open_sftp)，通常用于执行远程命令。
SFTPClient的作用类似与Linux的sftp命令，是对SFTP客户端的封装，用以实现远程文件操作，如文件上传、下载、修改文件权限等操作。


'''
'''
	paramiko的几个基础名词：
    1. channel： 一种类Socket，一种安全的SSH传输通道；`
    2. Transport：是一种加密的会话，使用时会同步创建了一个加密的Tunnels(通道)，这个Tunnels叫做Channel；
    3. Session：是client与Server保持连接的对象，用connect()/start_client()/start_server()开始会话。


'''
'''
2. SSHClient

  先来说一下SSHClient执行命令的两个方法：
  ssh.exec_command(cmd)
  channel = ssh.invoke_shell(); channel.send(cmd"\n")
  这两个的区别我们下面会介绍，提前放在这让大家可以有个印象，下面开始顺序介绍一下如何使用SSHClient进行SSH通信

先来看一个例子：

'''

import paramiko

# 实例化SSHClient
ssh = paramiko.SSHClient()

# 自动添加策略，保存服务器的主机名和密钥信息，如果不添加，那么不再本地know_hosts文件中记录的主机将无法连接
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

# 连接SSH服务端，以用户名和密码进行认证
ssh.connect(hostname='192.168.0.105', port=22, username='root', password='123456')

# 打开一个Channel并执行命令
stdin, stdout, stderr = ssh.exec_command('df -h ')  # stdout 为正确输出，stderr为错误输出，同时是有1个变量有值

# 打印执行结果
print(stdout.read().decode('utf-8'))

# 关闭SSHClient
ssh.close()

